# 和请求响应相关的文件
from datetime import datetime

import requests
from loguru import logger

dt = datetime.now().strftime('%y%m%d%H%M%S')
log_name = f"logs/test{dt}.log"
logger.add(log_name)


class SendRequest:

    def __init__(self, request):
        # 一个方法可以发送请求并获取响应--请求   __init__
        # 从request对象中提取接口信息
        method = request.method
        url = request.host + request.path
        headers = request.headers
        body = request.body
        logger.info(f'要调试接口:{method} {url} {body} {headers}')
        # 发送请求获取响应结果
        self.response = requests.request(method=method, url=url, headers=headers, json=body)
        if self.response.status_code in[200,301,302]:
            logger.info(f'接口返回响应:{self.response.status_code} {self.response.text} {self.response.headers} ')
        else:
            logger.error(f'接口返回响应:{self.response.status_code} {self.response.text} {self.response.headers} ')

    def get_value_path(self, json_path: str):
        """输入一个字符串描述json路径,结构写"""
        # 在响应中提取数据(body headers)--响应、提取参数
        json = self.response.json()
        path = json_path.split('.')  # json_path='$.a.b.c' path=['$','a','b','c']
        path.pop(0)  # 删除$ path=['a','b','c']
        for key in path:  # 循环path中每段key
            if '[' in key:  # key中有[数字] 说明key的结果是列表
                # 先获取这个列表
                json = json[key.split('[')[0]]  # 先按key值取出
                # 分割key中的数字,从取出的列表中获取数据
                json = json[int(key.split('[')[1].split(']')[0])]
            else:
                json = json[key]

        return json

    def get_value_border(self, start, end):
        # 在响应中提取数据(body headers)--响应、提取参数
        return self.response.text.split(start)[1].split(end)[0]

    # 判断响应结果是否符合预期--响应、预期数据
    def contains(self, msg):
        return msg in self.response.text
